home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 1 Issue 2 / PDCD-1 - Issue 02.iso / _utilities / utilities / 001 / meschach / !Meschach / h / zmatrix < prev    next >
Text File  |  1994-03-08  |  9KB  |  284 lines

  1.  
  2. /**************************************************************************
  3. **
  4. ** Copyright (C) 1993 David E. Steward & Zbigniew Leyk, all rights reserved.
  5. **
  6. **                 Meschach Library
  7. ** 
  8. ** This Meschach Library is provided "as is" without any express 
  9. ** or implied warranty of any kind with respect to this software. 
  10. ** In particular the authors shall not be liable for any direct, 
  11. ** indirect, special, incidental or consequential damages arising 
  12. ** in any way from use of the software.
  13. ** 
  14. ** Everyone is granted permission to copy, modify and redistribute this
  15. ** Meschach Library, provided:
  16. **  1.  All copies contain this copyright notice.
  17. **  2.  All modified copies shall carry a notice stating who
  18. **      made the last modification and the date of such modification.
  19. **  3.  No charge is made for this software or works derived from it.  
  20. **      This clause shall not be construed as constraining other software
  21. **      distributed on the same medium as this software, nor is a
  22. **      distribution fee considered a charge.
  23. **
  24. ***************************************************************************/
  25.  
  26.  
  27. /* Main include file for zmeschach library -- complex vectors and matrices */
  28.  
  29. #ifndef ZMATRIXH
  30. #define ZMATRIXH
  31.  
  32. #include "matrix.h"
  33.  
  34.  
  35.           /*  Type definitions for complex vectors and matrices  */
  36.  
  37.  
  38. /* complex definition */
  39. typedef struct  {
  40.                 Real re,im;
  41.         } complex;
  42.  
  43. /* complex vector definition */
  44. typedef struct  {
  45.                 u_int   dim, max_dim;
  46.                 complex  *ve;
  47.                 } ZVEC;
  48.  
  49. /* complex matrix definition */
  50. typedef struct  {
  51.                 u_int   m, n;
  52.                 u_int   max_m, max_n, max_size;
  53.                 complex *base;          /* base is base of alloc'd mem */
  54.                 complex **me;
  55.                 } ZMAT;
  56.  
  57. #define ZVNULL  ((ZVEC *)NULL)
  58. #define ZMNULL  ((ZMAT *)NULL)
  59.  
  60. #define    Z_CONJ        1
  61. #define    Z_NOCONJ    0
  62.  
  63.  
  64. /* memory functions */
  65.  
  66. #ifdef ANSI_C
  67. int zv_get_vars(int dim,...);
  68. int zm_get_vars(int m,int n,...);
  69. int zv_resize_vars(int new_dim,...);
  70. int zm_resize_vars(int m,int n,...);
  71. int zv_free_vars(ZVEC **,...);
  72. int zm_free_vars(ZMAT **,...);
  73.  
  74. #elif VARARGS
  75. int zv_get_vars();
  76. int zm_get_vars();
  77. int zv_resize_vars();
  78. int zm_resize_vars();
  79. int zv_free_vars();
  80. int zm_free_vars();
  81.  
  82. #endif
  83.  
  84.  
  85.  
  86.  
  87. #ifdef ANSI_C
  88. extern ZMAT    *_zm_copy(ZMAT *in,ZMAT *out,u_int i0,u_int j0);
  89. extern ZMAT    * zm_move(ZMAT *, int, int, int, int, ZMAT *, int, int);
  90. extern ZMAT    *zvm_move(ZVEC *, int, ZMAT *, int, int, int, int);
  91. extern ZVEC    *_zv_copy(ZVEC *in,ZVEC *out,u_int i0);
  92. extern ZVEC    * zv_move(ZVEC *, int, int, ZVEC *, int);
  93. extern ZVEC    *zmv_move(ZMAT *, int, int, int, int, ZVEC *, int);
  94. extern complex    z_finput(FILE *fp);
  95. extern ZMAT    *zm_finput(FILE *fp,ZMAT *a);
  96. extern ZVEC     *zv_finput(FILE *fp,ZVEC *x);
  97. extern ZMAT    *zm_add(ZMAT *mat1,ZMAT *mat2,ZMAT *out);
  98. extern ZMAT    *zm_sub(ZMAT *mat1,ZMAT *mat2,ZMAT *out);
  99. extern ZMAT    *zm_mlt(ZMAT *A,ZMAT *B,ZMAT *OUT);
  100. extern ZMAT    *zmma_mlt(ZMAT *A,ZMAT *B,ZMAT *OUT);
  101. extern ZMAT    *zmam_mlt(ZMAT *A,ZMAT *B,ZMAT *OUT);
  102. extern ZVEC    *zmv_mlt(ZMAT *A,ZVEC *b,ZVEC *out);
  103. extern ZMAT    *zsm_mlt(complex scalar,ZMAT *matrix,ZMAT *out);
  104. extern ZVEC    *zvm_mlt(ZMAT *A,ZVEC *b,ZVEC *out);
  105. extern ZMAT    *zm_adjoint(ZMAT *in,ZMAT *out);
  106. extern ZMAT    *zswap_rows(ZMAT *A,int i,int j,int lo,int hi);
  107. extern ZMAT    *zswap_cols(ZMAT *A,int i,int j,int lo,int hi);
  108. extern ZMAT    *mz_mltadd(ZMAT *A1,ZMAT *A2,complex s,ZMAT *out);
  109. extern ZVEC    *zmv_mltadd(ZVEC *v1,ZVEC *v2,ZMAT *A,complex alpha,ZVEC *out);
  110. extern ZVEC    *zvm_mltadd(ZVEC *v1,ZVEC *v2,ZMAT *A,complex alpha,ZVEC *out);
  111. extern ZVEC    *zv_zero(ZVEC *x);
  112. extern ZMAT    *zm_zero(ZMAT *A);
  113. extern ZMAT    *zm_get(int m,int n);
  114. extern ZVEC    *zv_get(int dim);
  115. extern ZMAT    *zm_resize(ZMAT *A,int new_m,int new_n);
  116. extern complex    _zin_prod(ZVEC *x,ZVEC *y,u_int i0,u_int flag);
  117. extern ZVEC    *zv_resize(ZVEC *x,int new_dim);
  118. extern ZVEC    *zv_mlt(complex scalar,ZVEC *vector,ZVEC *out);
  119. extern ZVEC    *zv_add(ZVEC *vec1,ZVEC *vec2,ZVEC *out);
  120. extern ZVEC    *zv_mltadd(ZVEC *v1,ZVEC *v2,complex scale,ZVEC *out);
  121. extern ZVEC    *zv_sub(ZVEC *vec1,ZVEC *vec2,ZVEC *out);
  122. #ifdef PROTOTYPES_IN_STRUCT
  123. extern ZVEC    *zv_map(complex (*f)(),ZVEC *x,ZVEC *out);
  124. extern ZVEC    *_zv_map(complex (*f)(),void *params,ZVEC *x,ZVEC *out);
  125. #else
  126. extern ZVEC    *zv_map(complex (*f)(complex),ZVEC *x,ZVEC *out);
  127. extern ZVEC    *_zv_map(complex (*f)(void *,complex),void *params,ZVEC *x,ZVEC *out);
  128. #endif
  129. extern ZVEC    *zv_lincomb(int n,ZVEC *v[],complex a[],ZVEC *out);
  130. extern ZVEC    *zv_linlist(ZVEC *out,ZVEC *v1,complex a1,...);
  131. extern ZVEC    *zv_star(ZVEC *x1, ZVEC *x2, ZVEC *out);
  132. extern ZVEC    *zv_slash(ZVEC *x1, ZVEC *x2, ZVEC *out);
  133. extern int    zm_free(ZMAT *mat);
  134. extern int    zv_free(ZVEC *vec);
  135.  
  136. extern ZVEC    *zv_rand(ZVEC *x);
  137. extern ZMAT    *zm_rand(ZMAT *A);
  138.  
  139. extern ZVEC    *zget_row(ZMAT *A, int i, ZVEC *out);
  140. extern ZVEC    *zget_col(ZMAT *A, int j, ZVEC *out);
  141. extern ZMAT    *zset_row(ZMAT *A, int i, ZVEC *in);
  142. extern ZMAT    *zset_col(ZMAT *A, int j, ZVEC *in);
  143.  
  144. extern ZVEC    *px_zvec(PERM *pi, ZVEC *in, ZVEC *out);
  145. extern ZVEC    *pxinv_zvec(PERM *pi, ZVEC *in, ZVEC *out);
  146.  
  147. extern void    __zconj__(complex zp[], int len);
  148. extern complex    __zip__(complex zp1[],complex zp2[],int len,int flag);
  149. extern void    __zmltadd__(complex zp1[],complex zp2[],
  150.                 complex s,int len,int flag);
  151. extern void    __zmlt__(complex zp[],complex s,complex out[],int len);
  152. extern void    __zadd__(complex zp1[],complex zp2[],complex out[],int len);
  153. extern void    __zsub__(complex zp1[],complex zp2[],complex out[],int len);
  154. extern void    __zzero__(complex zp[],int len);
  155. extern void    z_foutput(FILE *fp,complex z);
  156. extern void     zm_foutput(FILE *fp,ZMAT *a);
  157. extern void     zv_foutput(FILE *fp,ZVEC *x);
  158. extern void     zm_dump(FILE *fp,ZMAT *a);
  159. extern void     zv_dump(FILE *fp,ZVEC *x);
  160.  
  161. extern double    _zv_norm1(ZVEC *x, VEC *scale);
  162. extern double    _zv_norm2(ZVEC *x, VEC *scale);
  163. extern double    _zv_norm_inf(ZVEC *x, VEC *scale);
  164. extern double    zm_norm1(ZMAT *A);
  165. extern double    zm_norm_inf(ZMAT *A);
  166. extern double    zm_norm_frob(ZMAT *A);
  167.  
  168. complex    zmake(double real, double imag);
  169. double    zabs(complex z);
  170. complex zadd(complex z1,complex z2);
  171. complex zsub(complex z1,complex z2);
  172. complex    zmlt(complex z1,complex z2);
  173. complex    zinv(complex z);
  174. complex    zdiv(complex z1,complex z2);
  175. complex    zsqrt(complex z);
  176. complex    zexp(complex z);
  177. complex    zlog(complex z);
  178. complex    zconj(complex z);
  179. complex    zneg(complex z);
  180. #else
  181. extern ZMAT    *_zm_copy();
  182. extern ZVEC    *_zv_copy();
  183. extern ZMAT    *zm_finput();
  184. extern ZVEC     *zv_finput();
  185. extern ZMAT    *zm_add();
  186. extern ZMAT    *zm_sub();
  187. extern ZMAT    *zm_mlt();
  188. extern ZMAT    *zmma_mlt();
  189. extern ZMAT    *zmam_mlt();
  190. extern ZVEC    *zmv_mlt();
  191. extern ZMAT    *zsm_mlt();
  192. extern ZVEC    *zvm_mlt();
  193. extern ZMAT    *zm_adjoint();
  194. extern ZMAT    *zswap_rows();
  195. extern ZMAT    *zswap_cols();
  196. extern ZMAT    *mz_mltadd();
  197. extern ZVEC    *zmv_mltadd();
  198. extern ZVEC    *zvm_mltadd();
  199. extern ZVEC    *zv_zero();
  200. extern ZMAT    *zm_zero();
  201. extern ZMAT    *zm_get();
  202. extern ZVEC    *zv_get();
  203. extern ZMAT    *zm_resize();
  204. extern ZVEC    *zv_resize();
  205. extern complex    _zin_prod();
  206. extern ZVEC    *zv_mlt();
  207. extern ZVEC    *zv_add();
  208. extern ZVEC    *zv_mltadd();
  209. extern ZVEC    *zv_sub();
  210. extern ZVEC    *zv_map();
  211. extern ZVEC    *_zv_map();
  212. extern ZVEC    *zv_lincomb();
  213. extern ZVEC    *zv_linlist();
  214. extern ZVEC    *zv_star();
  215. extern ZVEC    *zv_slash();
  216.  
  217. extern ZVEC    *px_zvec();
  218. extern ZVEC    *pxinv_zvec();
  219.  
  220. extern ZVEC    *zv_rand();
  221. extern ZMAT    *zm_rand();
  222.  
  223. extern ZVEC    *zget_row();
  224. extern ZVEC    *zget_col();
  225. extern ZMAT    *zset_row();
  226. extern ZMAT    *zset_col();
  227.  
  228. extern int    zm_free();
  229. extern int    zv_free();
  230. extern void    __zconj__();
  231. extern complex    __zip__();
  232. extern void    __zmltadd__();
  233. extern void    __zmlt__();
  234. extern void    __zadd__();
  235. extern void    __zsub__();
  236. extern void    __zzero__();
  237. extern void    zm_foutput();
  238. extern void    zv_foutput();
  239. extern void    zm_dump();
  240. extern void    zv_dump();
  241.  
  242. extern double    _zv_norm1();
  243. extern double    _zv_norm2();
  244. extern double    _zv_norm_inf();
  245. extern double    zm_norm1();
  246. extern double    zm_norm_inf();
  247. extern double    zm_norm_frob();
  248.  
  249. complex    zmake();
  250. double    zabs();
  251. complex zadd();
  252. complex zsub();
  253. complex    zmlt();
  254. complex    zinv();
  255. complex    zdiv();
  256. complex    zsqrt();
  257. complex    zexp();
  258. complex    zlog();
  259. complex    zconj();
  260. complex    zneg();
  261. #endif
  262.  
  263. #define    zv_copy(x,y)    _zv_copy(x,y,0)
  264. #define    zm_copy(A,B)    _zm_copy(A,B,0,0)
  265.  
  266. #define    z_input()    z_finput(stdin)
  267. #define    zv_input(x)    zv_finput(stdin,x)
  268. #define    zm_input(A)    zm_finput(stdin,A)
  269. #define    z_output(z)    z_foutput(stdout,z)
  270. #define    zv_output(x)    zv_foutput(stdout,x)
  271. #define    zm_output(A)    zm_foutput(stdout,A)
  272.  
  273. #define    ZV_FREE(x)    ( zv_free(x), (x) = ZVNULL )
  274. #define    ZM_FREE(A)    ( zm_free(A), (A) = ZMNULL )
  275.  
  276. #define    zin_prod(x,y)    _zin_prod(x,y,0,Z_CONJ)
  277.  
  278. #define    zv_norm1(x)    _zv_norm1(x,VNULL)
  279. #define    zv_norm2(x)    _zv_norm2(x,VNULL)
  280. #define    zv_norm_inf(x)    _zv_norm_inf(x,VNULL)
  281.  
  282.  
  283. #endif
  284.